package com.ruoyi.app.controller;

import com.alibaba.fastjson.JSONObject;
import com.ruoyi.app.service.IAppShareService;
import com.ruoyi.app.service.IAppUserService;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.encrypt.utils.EncryptUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.ui.Model;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;

/**
 * app注册控制器
 * 前端访问路由地址为:/app/register
 *
 * @author Zach
 * @date 2023-11-14
 */
@Validated
@RequiredArgsConstructor
@Controller
@RequestMapping("/register")
public class AppRegisterHtmlController extends BaseController {

    private final IAppShareService iAppShareService;
    private final IAppUserService iAppUserService;

    public static void main(String[] args) {

        JSONObject jsonObject=new JSONObject();
        jsonObject.put("code","asdjkhaskj123");
        jsonObject.put("phone","*******2952");
        String res=EncryptUtils.encryptByBase64(jsonObject.toJSONString());
        System.out.println(res);
        System.out.println(EncryptUtils.decryptByBase64(res));
        boolean code = createCode("http://172.16.2.26:8080/app/register/toRegister/eyJjb2RlIjoiYXNkamtoYXNrajEyMyIsInBob25lIjoiKioqKioqKjI5NTIifQ==", "D:\\2.png");
        if (code){
            System.out.println("成功");
        }else {
            System.out.println("失败了");
        }


    }
    @GetMapping("/toRegister")
    public String toRegister(Model model,  String code)
    {
        String paramsSrt=EncryptUtils.decryptByBase64(code);
        JSONObject jsonObject=JSONObject.parseObject(paramsSrt);
        model.addAttribute("code",jsonObject.get("code"));
        model.addAttribute("phone",jsonObject.get("phone"));
        return "index";
    }

    @GetMapping("/toServer")
    public String toServer(Model model)
    {
        return "service_agreement";
    }

    /**
     * 1. 设置二维码的参数
     * 2. 生成二维码
     * 3. 将二维码导出
     */

    /**
     *
     * @param content 编码的内容
     * @param path 本地保存的路径
     * @return
     */
    public static boolean createCode(String content, String path) {
        // 1 设置基本参数
        int width = 300;
        int height = 300;
        String format = "png";//保存图片的格式，注意：不同平台可能有它的图片格式要求
        // 2 设置额外参数，一定要保存到map集合中
        Map map = new HashMap();
        // 2.1 设置容错率
        // 其中key键就是EncodeHintType.ERROR_CORRECTION
        // value值也是枚举类ErrorCorrectionLevel.M，可自行选择容错率等级l>M>Q>H
        // 当等级越高，扫描所需的时间越高，但是准确率越高。
        map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        // 2.2 生成条码的时候使用，指定边距，单位像素
        map.put(EncodeHintType.MARGIN, 2);
        // 2.3 设置字符集
        map.put(EncodeHintType.CHARACTER_SET, "utf-8");

        // 3 生成二维码
        // MultiFormatWriter继承了Writer
        // 通过该对象的encode方法即可生成二维码BitMatrix
        // 该方法形参分别对应了：
        // 第一个参数为编码的内容，
        // 第二个参数选择生成编码为二维码
        // 第三第四分别对应编码的宽度和高度
        // 第五个参数为对应的额外参数
        // 然后需要try、catch抛出异常
        try {
            BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, map);
            // 4 导出到本地
            File file = new File(path);
            Path path1 = file.toPath();
            System.out.println(path1);
            MatrixToImageWriter.writeToPath(encode, format, path1);
            return true;
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }

        return false;
    }
}
